#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>

pid_t pid;
int pip;
int generador;
typedef struct estjugador
{
	char nombre[30];
	int cantcartones;
	char ficherocartones[30];
	int trap_bingo;
	int trap_linea;
	int trap_bola;

} jugador, *pjugador;

void lol()
{
	
}
void errMsg( const char* pMsg )
{
    fflush( stdout );
    fputs( pMsg, stderr );
    fflush( stderr );
}
void readFromPipe( int fd )
{
    FILE *stream;
    int ch;
    int i=0;
    char str[30];
    char chr;
    errMsg( "reading\n" );
    signal(SIGUSR1,lol);


	
	/*fprintf(stderr, "INTENTO ABRIR ARCHIVO\n");
    if ( (stream = fdopen( fd, "r" )) == NULL )
    {
        perror( "fdopen() r" );
        exit(255);
    }

    sleep(3);
    kill(generador,SIGUSR1);//-1
    
    
    fscanf(stream, "%d", &ch);
    fprintf(stdout,"%d",ch);
    fprintf(stdout, " ");
    fflush(stdout);
    
    pause();
    
    
    while(fscanf(stream,"%d", &ch)!=EOF)
    {
		fprintf(stdout,"%d",ch);
		fprintf(stdout, " ");
		fflush(stdout);
	}


    fclose( stream );
    */
    errMsg( "reading done\n" );
}
     
/* Write some random text to the pipe. */
     
int main (int argc, char ** argv)
{

	int mypipe[2];
	int estado,i=0,j=0,exit=0,item=0,nbytes=0;
    FILE* config;
    FILE* loler;
	char str[30];
	char chr;
	char archivocartones[30], archivolog[30],archivobolas[30];
	int cantjugadores=0,pst=0,prt=0;
	char readbuffer[80];


	signal(SIGUSR1,lol);
	config = fopen("config.inf", "r");

	
	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%d", &cantjugadores);
	
	jugador vector[cantjugadores];//inicializamos el vector
	int tubos[3][2];//declaramos la matriz de los tubos, sumarle+1 para generador

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", archivocartones);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", archivolog);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", archivobolas);

	//Jugador 1
	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", vector[0].nombre);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%d", &vector[0].cantcartones);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", vector[0].ficherocartones);

	//Jugador 2
	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", vector[1].nombre);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%d", &vector[1].cantcartones);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", vector[1].ficherocartones);

	//Jugador 3
	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", vector[2].nombre);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%d", &vector[2].cantcartones);

	fscanf(config, "%s", str);
	fscanf(config, "%s", str);
	fscanf(config, "%s", vector[2].ficherocartones);


	fclose(config);	
    
    pipe(mypipe);//tubo del generador
    tubos[0][0]=mypipe[0];
    tubos[0][1]=mypipe[1];
    
    pipe(mypipe);//tubo del jugador 1
    tubos[1][0]=mypipe[0];
    tubos[1][1]=mypipe[1];
    
	
    
    for(i=0;i<3;i++)
    {
		if((pid==fork())>0)
		{
			break;
		}
		else
		{	
			j++;
		}
	}
	if(j==0)
	{
		prt=getpid();
		dup2(tubos[1][0],STDIN_FILENO);
		
		close(tubos[0][0]);
		close(tubos[0][1]);
		close(tubos[1][0]);
		close(tubos[1][1]);
		
		//execl("/home/zub/Bingo/jugador", "jugador", "Antonio", "5", "Antonio.txt", "todoscartones.txt",NULL);
	}
	if(j==1)
	{
		pst=getpid();
	}
	if(j==2)
	{
		generador=getpid();
		//dup2(mypipe[1],STDOUT_FILENO);
		dup2(tubos[0][1],STDOUT_FILENO);
		
		close(tubos[0][0]);
		close(tubos[0][1]);
		close(tubos[1][0]);
		close(tubos[1][1]);
		
		//close(mypipe[0]);
		//close(mypipe[1]);
		execl("/home/zub/Bingo/writetopipe", "writetopipe","lol","Antonio","5","Pavlichenko", "6", NULL);
	}
	if(j==cantjugadores)
	{
		//close(mypipe[1]);
		//dup2(mypipe[0],0);
		close(tubos[0][1]);
		dup2(tubos[0][0],0);

		int numero=0,cont;
		
		cont=0;

		while(read(STDIN_FILENO,&numero,sizeof(numero))!=EOF)
		{
		
			fprintf(stderr,"%d",numero);
			fprintf(stderr, " ");
			//fflush(stdout);
			//write(tubos[1][1],&numero,sizeof(numero));
			//fprintf(tubos[1][0],"%d",numero);
			break;
		}

		waitpid(generador);
        waitpid(pst);
        waitpid(prt);
        
	}
}

